18530
21875
Was ist die schnellste Methode, um einen java.nio.ByteBuffer a in einen (neu erstellten) CharBuffer b oder char [] b zu konvertieren?
Dabei ist es wichtig, dass a [i] == b [i]. Dies bedeutet, dass nicht a [i] und a [i + 1] zusammen einen Wert b [j] bilden, was getChar (i) tun würde, sondern die Werte sollten "verteilt" werden.
Byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // jeweils ein Byte (die vorzeichenbehaftet sind)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // jeweils ein Zeichen (die ohne Vorzeichen sind)
Beachten Sie, dass Byte: -128 die gleichen (unteren 8) Bits wie char: 128 hat. Daher gehe ich davon aus, dass die "beste" Interpretation so ist, wie ich es oben erwähnt habe, da die Bits gleich sind.
Danach brauche ich auch die umgekehrte Übersetzung: Der effizienteste Weg, um einen char [] oder java.nio.CharBuffer wieder in einen java.nio.ByteBuffer zu bringen. 
Sie möchten also mit der Codierung ISO-8859-1 konvertieren.
Ich behaupte nichts über Effizienz, aber es ist zumindest ziemlich kurz zu schreiben:
CharBuffer result = Charset.forName ("ISO-8859-1"). Decode (byteBuffer);
Die andere Richtung wäre:
ByteBuffer result = Charset.forName ("ISO-8859-1"). Encode (charBuffer);
Bitte messen Sie dies an anderen Lösungen. (Um fair zu sein, sollte der Teil Charset.forName nicht enthalten sein und sollte auch nur einmal ausgeführt werden, nicht für jeden Puffer erneut.)
Ab Java 7 gibt es auch die StandardCharsets-Klasse mit vorinstanziierten Charset-Instanzen, die Sie verwenden können
CharBuffer result = StandardCharsets.ISO_8859_1.decode (byteBuffer);
und
ByteBuffer result = StandardCharsets.ISO_8859_1.encode (charBuffer);
stattdessen. (Diese Zeilen machen dasselbe wie die vorherigen, nur die Suche ist einfacher und es besteht kein Risiko, die Namen falsch einzugeben, und es ist nicht erforderlich, die unmöglichen Ausnahmen zu erfassen.)
|
Ich würde @ Ishtar's zustimmen, vorschlagen, die Konvertierung in eine neue Struktur überhaupt zu vermeiden und nur nach Bedarf zu konvertieren.
Wenn Sie jedoch einen Heap-ByteBuffer haben, können Sie dies tun.
ByteBuffer bb = ...
Byte [] Array = bb.array ();
char [] chars = new char [bb.remaining ()];
für (int i = 0; i